package com.xygz.orm.enums;

/**
 * SQL 关键字
 *
 * @author xiyuan-lgz 2023-08-16 @version v1.0.0 新建与整理
 */
@SuppressWarnings("AlibabaLowerCamelCaseVariableNaming")
public enum SQLKeywords {
    /**
     * SQL关键字： INSERT
     */
    INSERT("INSERT"),
    
    /**
     * SQL关键字： DELETE
     */
    DELETE("DELETE"),
    
    /**
     * SQL关键字： UPDATE
     */
    UPDATE("UPDATE"),
    
    /**
     * SQL关键字： TRUNCATE, 需要数据库支持
     */
    TRUNCATE("TRUNCATE"),
    
    /**
     * SQL关键字： SELECT
     */
    SELECT("SELECT"),
    
    /**
     * SQL关键字： DISTINCT
     */
    DISTINCT("DISTINCT"),
    
    /**
     * SQL关键字： FROM
     */
    FROM("FROM"),
    
    /**
     * SQL关键字： DISTINCT
     */
    WHERE("WHERE"),
    
    /*****************************************************************/
    /*******************  聚合函数  ***********************************/
    /*****************************************************************/
    
    /**
     * SQL关键字： COUNT<br>
     */
    COUNT("COUNT"),
    
    /**
     * SQL关键字： AVG<br>
     */
    AVG("AVG"),
    
    /**
     * SQL关键字： SUM<br>
     */
    SUM("SUM"),
    
    /**
     * SQL关键字： MIN<br>
     */
    MIN("MIN"),
    /**
     * SQL关键字： MAX<br>
     */
    MAX("MAX"),
    
    /*****************************************************************/
    /*******************  条件关键字  *********************************/
    /*****************************************************************/
    
    /**
     * SQL关键字： and
     */
    AND("AND"),
    
    /**
     * SQL关键字： or
     */
    OR("OR"),
    
    /**
     * SQL关键字： is null <br>
     * <bre>
     * 例如：
     * tab.colum IS NULL
     * </pre>
     */
    IS_NULL("IS NULL"),
    
    /**
     * SQL关键字： is not null<br>
     * <pre>
     *     tab.colum IS NOT NULL
     * </pre>
     */
    IS_NOT_NULL("IS NOT NULL"),
    
    /**
     * SQL 条件关键字 '='<br>
     */
    EQ("="),
    
    /**
     * SQL 条件关键字 '<>'
     */
    NE("<>"),
    
    /**
     * SQL 条件关键字 '>'
     */
    GT(">"),
    
    /**
     * SQL 条件关键字 '>='
     */
    GE(">="),
    
    /**
     * SQL 条件关键字  '<' <br>
     */
    LT("<"),
    
    /**
     * SQL 条件关键字：'<='<br>
     */
    LE("<="),
    
    
    /**
     * SQL关键字： 'in'
     */
    IN("IN"),
    
    /**
     * SQL关键字： 'not in'
     */
    NOT_IN("NOT IN"),
    
    
    /**
     * SQL关键字： BETWEEN<br>
     */
    BETWEEN("BETWEEN"),
    
    /**
     * SQL关键字： NOT BETWEEN <br>
     */
    NOT_BETWEEN("NOT BETWEEN"),
    
    /**
     * SQL关键字： 'like'
     */
    LIKE("LIKE"),
    
    /**
     * SQL关键字： 'not like'
     */
    NOT_LIKE("NOT LIKE"),
    
    
    /******************* like 扩展 ******************************************/
    /**
     * 以开头，例如: tab.col not like 'abc%'
     */
    LIKE_L("LIKE"),
    
    /**
     * 以结尾 ，例如: tab.col not like '%abc'
     */
    LIKE_R("LIKE"),
    
    /**
     * 不以开头，例如: tab.col not like 'abc%'
     */
    NOT_LIKE_L("NOT LIKE"),
    
    /**
     * 不以结尾 ，例如: tab.col not like '%abc'
     */
    NOT_LIKE_R("NOT LIKE"),
    
    /*****************************************************************/
    /************************  end  *********************************/
    /**********************  分组聚合   *******************************/
    /*****************************************************************/
    
    /**
     * SQL关键字： group by<br>
     */
    GROUP_BY("GROUP BY"),
    
    /**
     * SQL关键字： HAVING<br>
     */
    HAVING("HAVING"),
    
    /*****************************************************************/
    /************************  end  *********************************/
    /**********************  排序   **********************************/
    /*****************************************************************/
    
    /**
     * SQL关键字： ORDER BY<br>
     */
    ORDER_BY("ORDER BY"),
    
    /**
     * SQL关键字： ASC<br>
     */
    ASC("ASC"),
    
    
    /**
     * SQL关键字： DESC<br>
     */
    DESC("DESC"),
    
    
    /*****************************************************************/
    /************************  end  *********************************/
    /**********************  case WHEN   ****************************/
    /*****************************************************************/
    
    /**
     * SQL关键字： CASE
     */
    CASE("CASE"),
    
    /**
     * SQL关键字： CASE
     */
    WHEN("WHEN"),
    
    /**
     * SQL关键字： THEN
     */
    THEN("THEN"),
    
    /**
     * SQL关键字： END
     */
    END("END"),
    
    /**
     * SQL关键字： not
     */
    NOT("NOT"),
    
    /*******************************************/
    // 扩展关键字 有部分 数据库不支持
    /*******************************************/
    // 可能部分SQL 不支持
    CONCAT("CONCAT"),
    
    /**
     * SQL关键字： EXISTS
     */
    EXISTS("EXISTS"),
    
    /**
     * SQL关键字： NOT EXISTS
     */
    NOT_EXISTS("NOT EXISTS"),
    
    /*******************************************/
    // like 扩展
    /*******************************************/
    
    
    /*******************************************/
    // 其他关键字 扩展
    /*******************************************/
    /**
     * SQL关键字 AS
     */
    AS("AS"),
    
    /**
     * SQL关键字 INTO
     */
    INTO("INTO"),
    
    /**
     * SQL关键字 VALUES
     */
    VALUES("VALUES"),
    
    ON("ON"),
    JOIN("JOIN"),
    INNER_JOIN("INNER JOIN"),
    LEFT_JOIN("LEFT JOIN"),
    RIGHT_JOIN("RIGHT JOIN"),
    CROSS_JOIN("CROSS JOIN"),
    UNION("UNION"),
    UNION_ALL("UNION ALL"),
    SET("SET"),
    ALTER("ALTER"),
    GRANT("GRANT"),
    OVER("OVER"),
    OFFSET("OFFSET"),
    ROWS("ROWS"),
    FETCH("FETCH"),
    NEXT("NEXT"),
    ONLY("ONLY"),
    
    //
    ;
    
    private final String keyword;
    
    
    private SQLKeywords(String keyword) {
        this.keyword = keyword;
    }
    
    public String keyName() {
        return this.name();
    }
    
    @Override
    public String toString() {
        return keyName();
    }
    
    public String toSQL() {
        return this.keyword;
    }
}